/**
 * author: MaHX
 * date: 2019/9/20/14:49
 * description:
 *
 * 线程八锁(synchronized)：
 * (1)两个普通同步方法，打印？                               one two
 * (2)两个普通同步方法,getOne（）睡眠3秒，打印？                    one two
 * (3)较(2)新增一个普通方法，打印？                           three      one two
 * (4)两个对象，两个普通同步方法，打印？                        two     one
 * (5)一个对象，一个普通同步方法，一个static同步方法getTwo，打印？ two     one
 * (6)一个对象，两个static同步方法？打印?                           one two
 * (7)两个对象，一个普通同步方法，一个static同步方法getTwo，打印？ two      one
 * (8)两个对象，两个static同步方法，打印？                           one two
 *
 * 关键点：
 * 1，非静态方法锁默认为this，静态方法锁为 对应的Class实例
 * 2，某一个时刻内，只有一个线程持有锁，无无论要执行几个方法
 *
 **/
public class Thread8Lock {
    public static void main(String args[]) {
        final Thread8LockDemo thread8LockDemo1 = new Thread8LockDemo();
        final Thread8LockDemo thread8LockDemo2 = new Thread8LockDemo();
        new Thread(new Runnable() {
            @Override
            public void run() {
                thread8LockDemo1.getOne();
            }
        }, "线程一").start();

        new Thread(new Runnable() {
            @Override
            public void run() {
                thread8LockDemo2.getTwo();
            }
        }, "线程二").start();

//        new Thread(new Runnable() {
//            @Override
//            public void run() {
//                thread8LockDemo.getThree();
//            }
//        },"线程三").start();
//    }
    }
}
class Thread8LockDemo{
    public synchronized static void getOne(){
        try {
            Thread.sleep(3000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println(Thread.currentThread().getName()+" : one");
    }
    public synchronized static void getTwo(){
        System.out.println(Thread.currentThread().getName()+" : two");
    }
    public void getThree(){
        System.out.println(Thread.currentThread().getName()+" : three");
    }
}
